﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int main()
//{
//	char c = 'x';
//	char ch = "abcdef";
//	char* pc = &ch;
//	char* p = &c;
//	printf("%c", *p);
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	char* pc = "abcdef";
//	printf("%c\n", "abcdef"[0]);
//	printf("%s\n", pc);
//	printf("%c", *pc);
//	return 0;
//}



//#include<stdio.h>
//int main()
//{
//	const char* pc = "abcdef";
//	printf("%s\n", pc);
//	*pc = "g";
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char str1[] = "tangsiqi";
//	char str2[] = "tangsiqi";
//	char* str3 = "tangsiqi";
//	char* str4 = "tangsiqi";
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//
//	if (str3 == str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//
//	if (&str3 == &str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//
//	return 0;
//}

////使用指针数组，模拟一个二维数组
//#include<stdio.h>
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//	//指针数组
//	int* arr[] = { arr1,arr2,arr3 };
//	//0   1     2
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)//找到首元素
//	{
//		for (j = 0; j < 5; j++)//遍历每一个数组的元素
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	char* arr[5] = { "tangsiqi","xueguodi","haha","hehe","xiaoxiao" };
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%s\n", arr[i]);
//	}
//	return 0;
//}

//数组名 vs &数组名
// &数组名是整个数组的地址
//数组名是数组首元素的地址
//除了两个例外：
//1.sizeof(数组名），这里的数组名表示整个数组，sizeof（数组名）计算的是整个数组的大小，单位是字节
//2.&数组名，这里的数组名表示整个数组名，取出的是数组的地址。
//#include<stdio.h>
//int main()
//{
//	int arr[10];
//	printf("%d\n", arr);
//	printf("%d\n", arr + 1);
//	printf("%d\n", &arr);
//	printf("%d\n", &arr + 1);
//	return 0;
//}




//#include<stdio.h>
//int main()
//{
//	int arr[10];
//	int(*p)[10] = &arr;
//	//p是用来存放整个数组的地址，p就是数组指针
//	char* arr2[5];
//	char* (*pc)[5] = &arr2;
//	return 0;
//}




////一维数组使用
//#include<stdio.h>
//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	int(*p)[5] = &arr;
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", (*p)[i]);//p[i]❌
//	}
//}

////一维数组传参
//#include<stdio.h>
//void print(int(*p)[5])
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d", (*p)[i]);
//	}
//}
//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//	print(&arr);
//	return 0;
//}



////二维数组
//#include<stdio.h>
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//	int(*p)[5] = arr;//二维数组数组名 ==首元素 == 二维数组的第一行
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d", p[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}


////二维数组
//#include<stdio.h>
//void print(int(*p)[5], int row, int col)//本质就是二维数组的首元素地址==第一行地址
////void print(int arr[3][5],int row,int col)
//{
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//	print(arr, 3, 5);
//	return 0;
//}


//#include<stdio.h>
//void print(int arr[])
////void print(int arr[10])
//{
//	int i = 0;
//	for (i = 0; i < 10;i++)
//	{
//		printf("%d ", *(arr+i));
//	}
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	print(arr);
//	return 0;
//}


//#include<stdio.h>
//void print(int* arr)
//{
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	print(arr);
//	return 0;
//}


//二维数组传参
//#include<stdio.h>
//void print(int arr[3][5],int row,int col)
//{
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d", arr[i][j]);
//		}
//		printf("\n");
//	}
//}
////int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//	print(arr, 3, 5);
//	return 0;
//}
//


//#include<stdio.h>
//void print(int(*p)[5], int row, int col)//✔
////void print(int (*arr)[3][5], int row, int col)✔
////void print(int (*arr)[][], int row, int col)❌
//void print(int (*arr)[][5], int row, int col)//❌
// //void print(int arr[][5], int row, int col)//✔
//{
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", p[i][j]);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
//	print(arr, 3, 5);
//	return 0;
//}
//



//#include <stdio.h>
//void test(int arr[])//ok?
//{}
//void test(int arr[10])//ok?
//{}
//void test(int* arr)//ok?
//{}
//void test2(int* arr[20])//ok?
//{}
//void test2(int** arr)//ok?
//{}
//int main()
//{
//	int arr[10] = { 0 };
//	int* arr2[20] = { 0 };
//	test(arr);
//	test2(arr2);
//}


//void test(int arr[3][5])//ok？
//{}
//void test(int arr[][])//ok？
//{}
//void test(int arr[][5])//ok？
//{}
////总结：二维数组传参，函数形参的设计只能省略第一个[]的数字。
////因为对一个二维数组，可以不知道有多少行，但是必须知道一行多少元素。
////这样才方便运算。
//void test(int* arr)//ok？
//{}
//void test(int* arr[5])//ok？
//{}
//void test(int(*arr)[5])//ok？
//{}
//void test(int** arr)//ok？
//{}
//int main()
//{
//	int arr[3][5] = { 0 };
//	test(arr);
//}